package main

import (
	"fmt"
	"time"
)

//定义一个错误类型
type MyError struct {
	//定义一个错误类型
	When time.Time
	What string
}

func (e MyError) Error() string {
	return fmt.Sprintf("at %v, %s", e.When, e.What)
	//return fmt.Sprintf("at %v", e) //导致死循环栈溢出  fmt里的输出函数再输出非基本类型时，会尝试查找对象的String方法和Error方法
}

func run() error {
	return &MyError{
		time.Now(),
		"it didn't work",
	}
}

func main() {
	if err := run(); err != nil {
		fmt.Println(err)
	}
}
